package com.company;

import java.util.*;

public class Main2 {

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        // 特殊处理
        if (n <= 0){
            System.out.printf("0\n");
            System.out.println();
            return;
        }

        Map<List<Integer>, Integer> map = new HashMap<>(n);
        while (n-- > 0){
            List<Integer> nums = new ArrayList<>(6);
            for (int i=0; i<6; ++i){
                nums.add(sc.nextInt());
            }

            boolean isContain = false;
            for(Map.Entry<List<Integer>, Integer> entry: map.entrySet()){
                if (contain(entry.getKey(), nums)){
                    entry.setValue(entry.getValue() + 1);
                    isContain = true;
                    break;
                }
            }
            if (!isContain)  map.put(nums, 1);
        }

        int size = map.size();
        System.out.printf("%d\n", size);
        for(Map.Entry<List<Integer>, Integer> entry: map.entrySet()){
            System.out.printf("%d", entry.getValue());
            if (size-- > 0) System.out.printf(" ");
        }
    }

    private static boolean contain(List<Integer> key, List<Integer> nums) {
        boolean res1 = (key.get(0) == nums.get(0) && key.get(1) == nums.get(1)) ||
                (key.get(0) == nums.get(1) && key.get(1) == nums.get(0));
        boolean res2 = (key.get(2) == nums.get(2) && key.get(3) == nums.get(3)) ||
                (key.get(2) == nums.get(3) && key.get(3) == nums.get(2));
        boolean res3 = (key.get(4) == nums.get(4) && key.get(5) == nums.get(5)) ||
                (key.get(4) == nums.get(5) && key.get(5) == nums.get(4));
        return (res1 && res2 && res3);
    }

    private static boolean contain2(List<Integer> key, List<Integer> nums) {
        // 判断有限翻转后两个数组是否相同

        // 1. 前后相同, 后面不同
        if (key.get(0) == nums.get(0) && key.get(1) == nums.get(1)){
            if (key.get(2) == nums.get(2) && key.get(3) == key.get(3)){
                return (key.get(4) == nums.get(4) && key.get(5) == key.get(5));
            } else {
                return key.get(2) == nums.get(5) && key.get(3) == key.get(4);
            }
        }

        // 2. 左右相同, 前后不同
        if (key.get(2) == nums.get(2) && key.get(3) == nums.get(3)){
            if (key.get(0) == nums.get(0) && key.get(1) == key.get(1)){
                return (key.get(4) == nums.get(4) && key.get(5) == key.get(5));
            } else {
                return key.get(0) == nums.get(4) && key.get(1) == key.get(5);
            }
        }

        // 3.
        if (key.get(4) == nums.get(4) && key.get(5) == nums.get(5)){
            if (key.get(0) == nums.get(0) && key.get(1) == key.get(1)){
                return (key.get(2) == nums.get(2) && key.get(3) == key.get(3));
            } else {
                return key.get(0) == nums.get(2) && key.get(1) == key.get(3);
            }
        }

        return false;
    }
}
